package com.ai.smlcore.service;

import java.util.List;
import java.util.Map;
import java.util.Set;

import com.ai.smlcore.util.BusinessException;

/**
 * Cache服务接口
 */
public interface ICacheService {

	/**
	 * 放入缓存,永久生效
	 * 
	 * @param cacheKey
	 *            缓存key值
	 * @param value
	 *            缓存的value值
	 * @throws Exception
	 * @ReturnType true=成功
	 */
	public boolean put2Cache(String cacheKey, String value) throws BusinessException;

	/**
	 * 放入缓存,并设置生效时间
	 * 
	 * @param cacheKey
	 *            缓存的key值
	 * @param value
	 *            缓存的value值
	 * @param seconds
	 *            失效时间(单位秒)
	 * @ReturnType true=成功
	 */
	public boolean put2Cache(String cacheKey, String value, int seconds) throws BusinessException;

	/**
	 * 从缓存中获取信息
	 * 
	 * @param cacheKey
	 *            缓存的key值
	 * @return 根据cacheKey取到的值
	 * @throws Exception
	 * @ReturnType String
	 */
	public String getFromCache(String cacheKey) throws BusinessException;

	/**
	 * 递增序列
	 * 
	 * @param cacheKey
	 *            缓存的key值
	 * @return
	 * @throws Exception
	 * @ReturnType long
	 */
	public long incr(String cacheKey) throws BusinessException;

	/**
	 * 递减序列
	 * 
	 * @param cacheKey
	 *            缓存的key值
	 * @return
	 * @throws Exception
	 * @ReturnType long
	 */
	public long decr(String cacheKey) throws BusinessException;

	/**
	 * 将Map放入缓存
	 * 
	 * @param cacheKey
	 *            缓存的key值
	 * @param map
	 *            待放入的值
	 * @return "OK" 成功
	 * @throws Exception
	 */
	public String putMap(String cacheKey, Map<String, String> map) throws BusinessException;

	/**
	 * 从缓存中读取map
	 * 
	 * @param cacheKey
	 *            缓存的key值
	 * @return 如果存在key值，则返回Map对象，如果不存在，则返回null
	 * @throws Exception
	 */
	public Map<String, String> getMap(String cacheKey) throws BusinessException;

	/**
	 * 进栈、入队  (可以把堆栈看作是一个从左至右的数组。如果左边压栈，右边出栈，那就是队列的入队/出队操作；如果左边压栈，左边出栈，那就是堆栈操作。)
	 * 
	 * @param key
	 *            缓存的key值
	 * @param values
	 *            push的值
	 * @return 存放的条数
	 * @throws Exception
	 */
	public Long lpush(String key, String... values) throws BusinessException;
	
	/**
	 * 进栈、入队  (可以把堆栈看作是一个从左至右的数组。如果右边压栈，左边出栈，那就是队列的入队/出队操作；如果右边压栈，右边出栈，那就是堆栈操作。)
	 * 
	 * @param key
	 *            缓存的key值
	 * @param values
	 *            push的值
	 * @return 存放的条数
	 * @throws Exception
	 */
	public Long rpush(String key, int seconds, String... values) throws BusinessException;
	
	/**
	 * 出栈    (可以把堆栈看作是一个从左至右的数组。如果左边压栈，右边出栈，那就是队列的入队/出队操作；如果左边压栈，左边出栈，那就是堆栈操作。)
	 * 
	 * @param key
	 *            缓存的key值
	 * @param values
	 *            push的值
	 * @return 存放的条数
	 * @throws Exception
	 */
	public List<String> lrange(String key, int start, int end, int seconds) throws BusinessException;
	
	/**
	 * 出栈    (可以把堆栈看作是一个从左至右的数组。如果左边压栈，右边出栈，那就是队列的入队/出队操作；如果左边压栈，左边出栈，那就是堆栈操作。)
	 * 
	 * @param key
	 *            缓存的key值
	 * @param values
	 *            push的值
	 * @return 存放的条数
	 * @throws Exception
	 */
	public String lpop(String key) throws BusinessException;
	
	/**
	 * 出队       (可以把堆栈看作是一个从左至右的数组。如果左边压栈，右边出栈，那就是队列的入队/出队操作；如果左边压栈，左边出栈，那就是堆栈操作。)
	 * 
	 * @param key
	 *            缓存的key值
	 * @param values
	 *            push的值
	 * @return 存放的条数
	 * @throws Exception
	 */
	public String rpop(String key) throws BusinessException;
	/**
	 * 操作有序的Set
	 * @param key 缓存的key值
	 * @param score 分值，根据这个进行排序
	 * @param member 存储的值
	 * @return
	 * @throws Exception
	 */
	public Long zadd(String key, double score, String member) throws BusinessException;
	
	/**
	 * 取分数在min和max之间的值
	 * 
	 * @param key
	 *            缓存的key值
	 * @param max
	 *            分数最大值
	 * @param min
	 *            分数最小值
	 * @return Set<String member>
	 * @throws Exception
	 */
	public Set<String> zrevrangeByScore(String key, double max, double min) throws BusinessException;
	
	/**
	 * 从set中删除键=key并且value=member的值，可以一次删除多行
	 * 
	 * @param key
	 *            主键
	 * @param member
	 *            待删除的值
	 * @return
	 * @throws Exception
	 */
	public Long zrem(String key, String... member) throws BusinessException;
	

	/**
	 * 根据key从缓存中删除
	 * @param cacheKey
	 * @return
	 * @throws Exception
	 */
	public void delFromCache(String cacheKey) throws BusinessException;  
	
	/**
	 * 是否存在缓存
	 * @param cacheKey
	 * @return 
	 * @throws Exception
	 */
	public boolean exists(String cacheKey) throws BusinessException;
	
	/**
	 * 不存在时缓存
	 * @param cacheKey
	 * @param value
	 * @return
	 * @throws BusinessException
	 */
	public boolean setnx(String cacheKey, String value) throws BusinessException;
}
